
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import csv


def RNN_alt(dataset_train, dataset_test, nb_epoch, nb_batch, optm_method, nb_neurons, nb_history, column):
    print("______________________ ANOTHER RUN ______________________________")
    print(" dataset : " + str(dataset_train))
    print(" epoch : " + str(nb_epoch))
    print(" batch : " + str(nb_batch))
    print(" optim : " + str(optm_method))
    print(" neurons : " + str(nb_neurons))
    print(" history : " + str(nb_history))
    print(" column : " + str(column))

    dataset_train = pd.read_csv(dataset_train)
    training_set = dataset_train[column].values.reshape(-1, 1)


    from sklearn.preprocessing import MinMaxScaler
    scal = MinMaxScaler(feature_range = (0, 1))
    training_set_scaled = scal.fit_transform(training_set)
    training_length = len(training_set)

    X_train = []
    y_train = []
    for i in range(nb_history, training_length):
        X_train.append(training_set_scaled[i-nb_history:i, 0])
        y_train.append(training_set_scaled[i, 0])
    X_train, y_train = np.array(X_train), np.array(y_train)


    from keras.models import Sequential
    from keras.layers import Dense, LSTM, Dropout

    net = Sequential()
    net.add(LSTM(units = nb_neurons, return_sequences = True, input_shape = (X_train.shape[1], 1)))
    net.add(Dropout(0.2))

    net.add(LSTM(units = nb_neurons, return_sequences = True))
    net.add(Dropout(0.2))

    net.add(LSTM(units = nb_neurons, return_sequences = True))
    net.add(Dropout(0.2))
    
    net.add(LSTM(units = nb_neurons, return_sequences = True))
    net.add(Dropout(0.2))

    net.add(LSTM(units = nb_neurons, return_sequences = True))
    net.add(Dropout(0.2))
    
    net.add(LSTM(units = nb_neurons, return_sequences = True))
    net.add(Dropout(0.2))

    net.add(LSTM(units = nb_neurons, return_sequences = True))
    net.add(Dropout(0.2))

    net.add(LSTM(units = nb_neurons))
    net.add(Dropout(0.2))
    net.add(Dense(units = 1))

    net.compile(optimizer = optm_method, loss = 'mean_squared_error')
    net.fit(X_train, y_train, epochs = nb_epoch, batch_size = nb_batch) 

    dataset_test = pd.read_csv(dataset_test)
    real_stock_price = dataset_test[column].values.reshape(-1, 1)

    dataset_total = pd.concat((dataset_train[column], dataset_test[column]), axis = 0)
    inputs = dataset_total[len(dataset_total) - len(dataset_test) - nb_history:].values
    inputs = inputs.reshape(-1,1)
    inputs = scal.transform(inputs)
    X_test = []


    new_length = nb_history + len(dataset_test) 
    for i in range(nb_history, new_length):
        X_test.append(inputs[i-nb_history:i, 0])

    X_test = np.array(X_test)
    X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

    predicted_stock_price = net.predict(X_test)
    predicted_stock_price = scal.inverse_transform(predicted_stock_price.reshape(-1, 1))
    predicted_stock_price = np.squeeze(predicted_stock_price)
    real_arr = []

    print(" >>>  predicted:" + str(predicted_stock_price))
    print(" >>>  real:" + str(real_stock_price))